package jp.androidgroup.chiba.androidresearch.data;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import jp.androidgroup.chiba.androidresearch.Common;

import android.content.Context;
import android.database.Cursor;
import android.os.Parcel;
import android.os.Parcelable;

/**
 * カウンターデータクラス
 */
public class Counter extends Base implements Parcelable {
	private String id;
	private String key;
	private String contributeDate;
	private String email;
	private String userName;
	private String placeId;
	private String timeId;
	private String detailNum;
	private String uploadDate;
	//// ↓ 明細情報 ↓　/////
	private String occupationId;
	private String sex;
	private String memo;
	private String useId;
	private String detailNo;
	private String detailMemo;
	private String num;
	private String allinfo;
	private String createDate;
	private List<Counter> details;
	
	
	public Counter() {}
	
	
	public Counter(Cursor cursor) {
		if (cursor.isBeforeFirst()) {
			cursor.moveToFirst();
		}
		
		final int columnCount = cursor.getColumnCount();
		String name;
		String text;
		for (int i = 0 ; i < columnCount ; i++) {
			name = cursor.getColumnName(i);
			text = cursor.getString(i);
			
			if ("Id".equals(name)) {
				id = text;
			} else if ("Key".equals(name)) {
				key = text;
			} else if ("ContributeDate".equals(name)) {
				contributeDate = text;
			} else if ("Email".equals(name)) {
				email = text;
			} else if ("UserName".equals(name)) {
				userName = text;
			} else if ("PlaceId".equals(name)) {
				placeId = text;
			} else if ("TimeId".equals(name)) {
				timeId = text;
			} else if ("DetailNum".equals(name)) {
				detailNum = text;
			} else if ("UploadDate".equals(name)) {
				uploadDate = text;
			} else if ("OccupationId".equals(name)) {
				occupationId = text;
			} else if ("Sex".equals(name)) {
				sex = text;
			} else if ("Memo".equals(name)) {
				memo = text;
			} else if ("DetailMemo".equals(name)) {
				detailMemo = text;
			} else if ("Num".equals(name)) {
				num = text;
			} else if ("UseId".equals(name)) {
				useId = text;
			} else if ("DetailNo".equals(name)) {
				detailNo = text;
			} else if ("CreateDate".equals(name)) {
				createDate = text;
			}
		}
	}
	

	/**
	 * ダミー
	 */
	public String getName() {
		return null;
	}
	
	/**
	 * IDの設定
	 *
	 * @param id ID
	 */
	public void setId(String id) {
		this.id = id;
	}

	/**
	 * IDの取得
	 *
	 * @return ID
	 */
	public String getId() {
		return id;
	}

	/**
	 * グループキーの設定
	 *
	 * @param key キーコード
	 */
	public void setKey(String key) {
		this.key = key;
	}

	/**
	 * グループキーの取得
	 *
	 * @return キーコード
	 */
	public String getKey() {
		return key;
	}

	/**
	 * カウント日の設定
	 *
	 * @param contributeDate 投稿日時
	 */
	public void setContributeDate(String contributeDate) {
		this.contributeDate = contributeDate;
	}

	/**
	 * カウント日の取得
	 *
	 * @return 投稿日時
	 */
	public String getContributeDate() {
		return contributeDate;
	}

	/**
	 * @return email
	 */
	public String getEmail() {
		return email;
	}

	/**
	 * @param email セットする email
	 */
	public void setEmail(String email) {
		this.email = email;
	}

	/**
	 * 投稿者の設定
	 *
	 * @param userName 投稿者
	 */
	public void setUserName(String userName) {
		this.userName = userName;
	}

	/**
	 * 投稿者の取得
	 *
	 * @return 投稿者
	 */
	public String getUserName() {
		return userName;
	}

	/**
	 * 場所IDの設定
	 *
	 * @param placeId 場所ID
	 */
	public void setPlaceId(String placeId) {
		this.placeId = placeId;
	}

	/**
	 * 場所IDの取得
	 *
	 * @return 場所ID
	 */
	public String getPlaceId() {
		return placeId;
	}

	/**
	 * 時間帯IDの設定
	 *
	 * @param timeId 時間帯ID
	 */
	public void setTimeId(String timeId) {
		this.timeId = timeId;
	}

	/**
	 * 時間帯IDの取得
	 *
	 * @return the timeId
	 */
	public String getTimeId() {
		return timeId;
	}

	/**
	 * @return detailNum
	 */
	public String getDetailNum() {
		return detailNum;
	}

	/**
	 * @param detailNum セットする detailNum
	 */
	public void setDetailNum(String detailNum) {
		this.detailNum = detailNum;
	}

	/**
	 * サーバ登録日時
	 *
	 * @return uploadDate
	 */
	public String getUploadDate() {
		return uploadDate;
	}

	/**
	 * サーバ登録日時
	 */
	public void setUploadDate(String uploadDate) {
		this.uploadDate = uploadDate;
	}

	/**
	 * 職業IDの設定
	 *
	 * @param occupationId 職業ID
	 */
	public void setOccupationId(String occupationId) {
		this.occupationId = occupationId;
	}

	/**
	 * 職業IDの取得
	 *
	 * @return occupationId 職業ID
	 */
	public String getOccupationId() {
		return occupationId;
	}

	/**
	 * 性別の設定
	 *
	 * @param sex 性別
	 */
	public void setSex(String sex) {
		this.sex = sex;
	}

	/**
	 * 性別の取得
	 *
	 * @return 性別
	 */
	public String getSex() {
		return sex;
	}

	/**
	 * メモの設定
	 *
	 * @param memo メモ
	 */
	public void setMemo(String memo) {
		this.memo = memo;
	}

	/**
	 * メモの取得
	 *
	 * @return メモ
	 */
	public String getMemo() {
		return memo;
	}

	/**
	 * @param allinfo セットする allinfo
	 */
	public void setAllinfo(String allinfo) {
		this.allinfo = allinfo;
	}

	/**
	 * @return allinfo
	 */
	public String getAllinfo() {
		return allinfo;
	}

	/**
	 * 明細メモの設定
	 *
	 * @param detailMemo 明細メモ
	 */
	public void setDetailMemo(String detailMemo) {
		this.detailMemo = detailMemo;
	}

	/**
	 * 明細メモの取得
	 *
	 * @return the detailMemo 明細メモ
	 */
	public String getDetailMemo() {
		return detailMemo;
	}

	/**
	 * 人数の設定
	 *
	 * @param num 人数
	 */
	public void setNum(String num) {
		this.num = num;
	}

	/**
	 * 人数の取得
	 * @return 人数
	 */
	public String getNum() {
		return num;
	}

	/**
	 * 利用区分の設定
	 *
	 * @param useId 利用区分
	 */
	public void setUseId(String useId) {
		this.useId = useId;
	}

	/**
	 * 利用区分の取得
	 *
	 * @return 利用区分
	 */
	public String getUseId() {
		return useId;
	}

	/**
	 * 明細番号の設定
	 *
	 * @param detailNo 明細番号
	 */
	public void setDetailNo(String detailNo) {
		this.detailNo = detailNo;
	}

	/**
	 * 明細番号の取得
	 *
	 * @return 明細番号
	 */
	public String getDetailNo() {
		return detailNo;
	}

	/**
	 * @return createDate
	 */
	public String getCreateDate() {
		return createDate;
	}

	/**
	 * @param createDate セットする createDate
	 */
	public void setCreateDate(String createDate) {
		this.createDate = createDate;
	}

	/**
	 * 明細データの設定
	 *
	 * @param details 明細データ
	 */
	public void setDetails(List<Counter> details) {
		this.details = details;
	}

	/**
	 * 明細データの取得
	 *
	 * @return 明細データ
	 */
	public List<Counter> getDetails() {
		return details;
	}

	/* (非 Javadoc)
	 * @see ne.kyuji.androidresearch.pojo.Pojo#getColumns()
	 */
	@Override
	public String[] getColumns() {
		// TODO Auto-generated method stub
		return new String[] { "Key", "ContributeDate", "Email", "UserName",
				"PlaceId", "TimeId", "DetailNum", "OccupationId", "UploadDate",
				"Sex", "Memo", "DetailMemo", "Num", "UseId", "DetailNo",
				"CreateDate" };
	}

	/**
	 * グループキー
	 *
	 * @param cont
	 * @return 一意のキー（カウント日+投稿日時+端末ID）
	 */
	public static String getUniqKey(Context cont, String contributedate){
		SimpleDateFormat sdf;

		sdf = new SimpleDateFormat("yyMMddHHmmss");

		return contributedate + "_" + sdf.format(new Date()) + "_" + Common.getTelephonyUniqId(cont);
	}
	
	/*
	 * Parcelable実装時のあれこれ
	 * 
	 * android.os.Parcelableを実装するときは
	 * 
	 * 1. public void writeToParcel(Parcel out, int flag)
	 * 2. public int describeContents()
	 * 3. public static final Parcelable.Creator<T> CREATOR
	 * 4. private T(Parcel in)
	 * 
	 * を実装します。
	 * 項目の1と4は対になっており、1でParcelに入れる順番と4でParcelから取り出す順番は同じにする必要があります。
	 * 4のCREATORはstatic finalかつ名前をCREATORにしないとエラーになります（特にProGuardで暗号化する場合）。
	 * 
	 * (non-Javadoc)
	 * @see android.os.Parcelable#writeToParcel(android.os.Parcel, int)
	 */
	public void writeToParcel(Parcel out, int flag) {
		out.writeString(id);
		out.writeString(key);
		out.writeString(contributeDate);
		out.writeString(email);
		out.writeString(userName);
		out.writeString(placeId);
		out.writeString(timeId);
		out.writeString(detailNum);
		out.writeString(uploadDate);
		out.writeString(occupationId);
		out.writeString(sex);
		out.writeString(memo);
		out.writeString(useId);
		out.writeString(detailNo);
		out.writeString(detailMemo);
		out.writeString(num);
		out.writeString(allinfo);
		out.writeString(createDate);
		
		// detailsは初期化されていない可能性があるので、フラグを一つ入れる
		// 0ならばList読み込み
		if (details != null) {
			out.writeInt(0);
			out.writeList(details);
		} else {
			out.writeInt(1);
		}
	}
	
	public int describeContents() {
		return 0;
	}
	
	public static final Parcelable.Creator<Counter> CREATOR = new Parcelable.Creator<Counter>() {
		
		public Counter createFromParcel(Parcel source) {
			return new Counter(source);
		}
		
		public Counter[] newArray(int size) {
			return new Counter[size];
		}
	};
	
	private Counter(Parcel in) {
		id = in.readString();
		key = in.readString();
		contributeDate = in.readString();
		email = in.readString();
		userName = in.readString();
		placeId = in.readString();
		timeId = in.readString();
		detailNum = in.readString();
		uploadDate = in.readString();
		occupationId = in.readString();
		sex = in.readString();
		memo = in.readString();
		useId = in.readString();
		detailNo = in.readString();
		detailMemo = in.readString();
		num = in.readString();
		allinfo = in.readString();
		createDate = in.readString();
		
		// detailsのフラグ読み込み
		if (in.readInt() == 0) {
			// TODO
			// ArrayList以外が利用される可能性がある場合もある？
			// ArrayListしか使わないのであれば、detailsをArrayListにするのもあり？
			details = new ArrayList<Counter>();
			in.readList(details, Counter.class.getClassLoader());
		}
	}
}
